package main

import (
	"fmt"
	sentinel "github.com/alibaba/sentinel-golang/api"
	"github.com/alibaba/sentinel-golang/core/flow"
	"github.com/alibaba/sentinel-golang/util"
	"math/rand"
	"time"
)

func main() {

	// 初始化
	err := sentinel.InitDefault()
	if err != nil {
		panic(err)
	}

	// 配置一条限流规则
	_, err = flow.LoadRules([]*flow.Rule{
		{
			Resource:               "order-flow-qps",
			Threshold:              10,          // 每秒中最多处理10次，超过直接拒绝，等下个1秒中继续开始。
			TokenCalculateStrategy: flow.Direct, // 当前流量控制器的Token计算策略QPS
			ControlBehavior:        flow.Reject, // Reject表示超过阈值直接拒绝
			StatIntervalInMs:       1000,        // 规则对应的流量控制器的独立统计结构的统计周期。
		},
	})
	if err != nil {
		panic(err)
	}

	for i := 0; i < 12; i++ {
		e, b := sentinel.Entry("order-flow-qps")
		if b != nil { // 被限流了
			fmt.Println(util.CurrentTimeMillis(), "blocking限流了")
			// 请求被拒绝，在此处进行处理
			time.Sleep(time.Duration(rand.Uint64()%10) * time.Millisecond)
		} else {
			fmt.Println(util.CurrentTimeMillis(), "Passed")
			u := rand.Uint64()
			time.Sleep(time.Duration(u%10) * time.Millisecond)
			e.Exit()
		}
	}

}
